from django.db import models

# Create your models here.
from django.db import models

# Create your models here.

# 用户表
class UserInfo(models.Model):
    username = models.CharField(verbose_name="用户名", max_length=32)
    email = models.EmailField(verbose_name="邮箱", max_length=32)
    mobile_phone = models.CharField(verbose_name="手机号", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=32)
    # price_policy = models.ForeignKey(verbose_name="价格策略", to="PricePolicy",
    #                                  on_delete=models.CASCADE)

    def __str__(self):
        return self.username
# 价格策略表
class PricePolicy(models.Model):
    category_choices = (
        (1, "免费版"),
        (2, "收费版"),
        (3, "其他")
    )
    category = models.SmallIntegerField(verbose_name="分类", choices=category_choices,default=2)
    title = models.CharField(verbose_name="标题", max_length=32)
    price = models.PositiveIntegerField(verbose_name="价格")  # PositiveIntegerField 正整数
    project_num = models.PositiveIntegerField(verbose_name="项目个数")
    project_member = models.PositiveIntegerField(verbose_name="项目成员个数")
    project_space = models.PositiveIntegerField(verbose_name="单项目空间")
    per_file_size = models.PositiveIntegerField(verbose_name="单文件大小")
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
# 交易记录表
class Transaction(models.Model):
    status_choices = (
        (1, "已支付"),
        (2, "未支付")
    )
    status = models.SmallIntegerField(verbose_name="状态", choices=status_choices)
    user = models.ForeignKey(verbose_name="用户", to='UserInfo', on_delete=models.CASCADE)
    price_policy = models.ForeignKey(verbose_name="价格策略", to="PricePolicy", on_delete=models.CASCADE)
    price = models.IntegerField(verbose_name="实际支付价格")
    order = models.CharField(verbose_name="订单号", max_length=64, unique=True)
    count = models.IntegerField(verbose_name="数量（年）", help_text="0表示无限期")
    start_datetime = models.DateTimeField(verbose_name="开始时间", null=True, blank=True)
    end_datetime = models.DateTimeField(verbose_name="结束时间", null=True, blank=True)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

# 项目表
class Project(models.Model):
    color_choices = (
        (1, "#56b8eb"),
        (2, "#f28033"),
        (3, "#ebc656"),
        (4, "#a2d148"),
        (5, "#20BFA4"),
        (6, "#7461c2"),
        (7, "#20bfa3"),
    )
    title = models.CharField(verbose_name="项目名称", max_length=32)
    desc = models.CharField(verbose_name="项目描述", max_length=255, null=True, blank=True)
    color = models.SmallIntegerField(verbose_name="颜色", choices=color_choices, default=1)
    star = models.BooleanField(verbose_name="星标", default=False)
    join_count = models.PositiveIntegerField(verbose_name="参与人数", default=1)
    creator = models.ForeignKey(verbose_name="创建者", to="UserInfo", on_delete=models.CASCADE)
    use_space = models.PositiveIntegerField(verbose_name="项目已使用空间", default=0)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

    bucket = models.CharField(verbose_name="桶名称", max_length=128)
    region = models.CharField(verbose_name="桶的区域", max_length=32)


# 项目参与者表
class ProjectUser(models.Model):
    user = models.ForeignKey(verbose_name="参与者", to="UserInfo", on_delete=models.CASCADE)
    project = models.ForeignKey(verbose_name="项目", to="Project", on_delete=models.CASCADE)
    star = models.BooleanField(verbose_name="星标", default=False)
    create_datetime = models.DateTimeField(verbose_name="加入时间", auto_now_add=True)


class Wiki(models.Model):
    project = models.ForeignKey(verbose_name="项目", to="Project", on_delete=models.CASCADE)
    title = models.CharField(verbose_name="标题", max_length=32)
    content = models.TextField(verbose_name="内容")
    depth = models.IntegerField(verbose_name="深度", default=1)

    # 自关联
    parent = models.ForeignKey(verbose_name="父文章", to="Wiki", null=True, blank=True, related_name="children", on_delete=models.CASCADE)
    def __str__(self):
        return self.title

class FileRepository(models.Model):
    """文件库"""
    project = models.ForeignKey(verbose_name="项目", to="Project", on_delete=models.CASCADE)
    file_type_choices = (
        (1, "文件"),
        (2, "文件夹")
    )
    file_type = models.SmallIntegerField(verbose_name="类型", choices=file_type_choices)
    name = models.CharField(verbose_name="文件名称", max_length=32, help_text="文件或文件夹名")
    key = models.CharField(verbose_name="文件存储在COS的key", max_length=128, null=True, blank=True)
    file_size = models.IntegerField(verbose_name="文件大小", null=True, blank=True)
    file_path = models.CharField(verbose_name="文件路径", max_length=255, null=True, blank=True)
    parent = models.ForeignKey(verbose_name="父级目录", to="self", related_name="child", null=True, blank=True, on_delete=models.CASCADE)
    update_user = models.ForeignKey(verbose_name="最近更新者", to="UserInfo", on_delete=models.CASCADE)
    update_datetime = models.DateTimeField(verbose_name="更新时间", auto_now_add=True)


class Issues(models.Model):
    """问题表"""
    project = models.ForeignKey(verbose_name="项目", to='Project', on_delete=models.CASCADE)
    issues_type = models.ForeignKey(verbose_name="问题类型", to='IssueType', on_delete=models.CASCADE)
    module = models.ForeignKey(verbose_name="模块", to='Module',null=True, blank=True, on_delete=models.CASCADE)
    subject = models.CharField(verbose_name="主题", max_length=80)
    desc = models.TextField(verbose_name="问题描述")
    priority_choices = (
        ("danger", "高"),
        ("warning", "中"),
        ("success", "低"),
    )
    priority = models.CharField(verbose_name="优先级", max_length=32, choices=priority_choices, default='danger')
    # 状态：新建，处理中，已解决，已忽略，待反馈，已关闭，重新打开
    status_choices = (
        (1, "新建"),
        (2, "处理中"),
        (3, "已解决"),
        (4, "已忽略"),
        (5, "待反馈"),
        (6, "已关闭"),
        (7, "重新打开"),
    )
    status = models.SmallIntegerField(verbose_name="状态", choices=status_choices, default=1)
    # 指派给谁
    assign = models.ForeignKey(verbose_name="指派给谁", to='UserInfo', related_name="task", null=True, blank=True, on_delete=models.CASCADE)
    # 关注着
    attention = models.ManyToManyField(verbose_name="关注着", to='UserInfo', related_name="observer",
                                       null=True, blank=True)
    start_date = models.DateField(verbose_name="开始时间", null=True, blank=True)
    end_date = models.DateField(verbose_name="结束时间", null=True, blank=True)
    # 模式
    mode_choices = (
        (1, "公开模式"),
        (2, "隐私模式"),
    )
    mode = models.SmallIntegerField(verbose_name="模式", choices=mode_choices, default=1)
    parent = models.ForeignKey(verbose_name="父问题", to='self', null=True, blank=True,related_name='child', on_delete=models.CASCADE)
    creator = models.ForeignKey(verbose_name="创建者", to="UserInfo", related_name="create_problems", on_delete=models.CASCADE)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    update_datetime = models.DateTimeField(verbose_name="最后更新时间", auto_now_add=True)

    def __str__(self):
        return self.subject

class Module(models.Model):
    """模块类"""
    project = models.ForeignKey(verbose_name="项目", to='Project', on_delete=models.CASCADE)
    title = models.CharField(verbose_name="模块名称", max_length=32)

    def __str__(self):
        return self.title

class IssueType(models.Model):
    """问题类型"""
    ISSUE_TYPE_LIST = ["问题", "任务", "Bug"]
    project = models.ForeignKey(verbose_name="项目", to='Project', on_delete=models.CASCADE)
    title = models.CharField(verbose_name="问题类型", max_length=32)
    def __str__(self):
        return self.title


class IssuesReply(models.Model):
    """问题回复表"""
    reply_type_choices = (
        (1, "修改记录"),
        (2, "回复")
    )
    reply_type = models.SmallIntegerField(verbose_name="类型", choices=reply_type_choices, )
    issues = models.ForeignKey(verbose_name="问题", to='Issues', on_delete=models.CASCADE)
    content = models.TextField(verbose_name="描述", max_length=128)
    creator = models.ForeignKey(verbose_name="创建者", to="UserInfo", related_name="create_reply",  on_delete=models.CASCADE)
    create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    reply = models.ForeignKey(verbose_name="父回复", to='self', null=True, blank=True, on_delete=models.CASCADE)


class ProjectInvite(models.Model):
    """项目邀请码"""
    project = models.ForeignKey(verbose_name="项目", to="Project", on_delete=models.CASCADE)
    code = models.CharField(verbose_name="邀请码", max_length=128, unique=True)
    count = models.PositiveIntegerField(verbose_name="限制数量", null=True, blank=True, help_text="空表示无数量限制")
    use_count = models.PositiveIntegerField(verbose_name="已使用数量", default=0)
    period_choices = (
        (30, "30分钟"),
        (60, "1小时"),
        (300, "5小时"),
        (1440, "24小时"),
    )
    period = models.IntegerField(verbose_name="有效期", choices=period_choices, default=1440)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    creator = models.ForeignKey(verbose_name="创建者", to="UserInfo", on_delete=models.CASCADE, related_name="create_invite")




